package ar.edu.utn.frsf.tpae.a2012.g05.dao.mock;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import ar.edu.utn.frsf.tpae.a2012.g05.dao.CuentaDao;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g05.exception.PersistenciaException;

@Repository
public class CuentaDaoMock implements CuentaDao {
	private List<Cuenta> cuentas = new ArrayList<Cuenta>();
	private Integer nextId = 1;

	public Cuenta saveOrUpdate(Cuenta cuenta) {
		if (findById(cuenta.getId()) == null)
			// si no existe le asigno un identificador
			cuenta.setId(nextId++);
		else
			// si ya existe lo elimino 
			this.cuentas.remove(cuenta);
		
		this.cuentas.add(cuenta);
		return cuenta;
	}

	public void delete(Cuenta cuenta) throws PersistenciaException {
		if (!this.cuentas.remove(cuenta))
			throw new PersistenciaException("El elemento que se intenta eliminar no existe");
	}

	public Cuenta findById(Integer id) {
		for(Cuenta cuenta : this.cuentas) {
			if(cuenta.getId() == id)
				return cuenta;
		}
		return null;
	}

	public Cuenta findByNumber(Integer id) {
		for(Cuenta cuenta : this.cuentas) {
			if(cuenta.getNumero().equals(id))
				return cuenta;
		}
		return null;
	}

	public List<Cuenta> findAll() {
		return this.cuentas;
	}

	public List<Cuenta> findCuentasCliente(Integer id) {
		List<Cuenta> cuentas = new ArrayList<Cuenta>();
		for(Cuenta cuenta : this.cuentas) {
			if(cuenta.getCliente().getId() == id)
				cuentas.add(cuenta);
		}
		return cuentas;
	}

	@Override
	public BigDecimal getSaldo(Integer idCuenta) throws PersistenciaException {
		for(Cuenta cuenta : this.cuentas) {
			if(cuenta.getId() == idCuenta)
				return cuenta.getSaldoActual();
		}
		return null;
	}

	@Override
	public void debitar(Cuenta cuenta, BigDecimal monto) {
		cuenta.setSaldoActual(cuenta.getSaldoActual().subtract(monto));
		saveOrUpdate(cuenta);
	}
}
